Emacs 配置之查找是否有“*scheme*”窗口

最近终于下定决心学习一下lisp,打算从SICP开始吧。
编辑器打算采用Emacs,原因是它是用C和Emacs Lisp(Lisp的一种方言)编写的程序。
Emacs还真的是难学啊,在掌握了基本(基本)的操作后,开始配置Emacs的环境,参考的很多网上的一些代码,就不多说了。
这里要说的是我在借鉴了大牛王垠的配置后,在使用的时候会报一个找不到find函数的的错误,源代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
(defun scheme-split-window ()
(cond
((= 1 (count-windows))
(delete-other-windows)
(split-window-vertically (floor (* 0.68 (window-height))))
(other-window 1)
(switch-to-buffer "*scheme*")
(other-window 1))
((not (find "*scheme*"
(mapcar (lambda (w) (buffer-name (window-buffer w)))
(window-list))
:test 'equal))
(other-window 1)
(switch-to-buffer "*scheme*")
(other-window -1))))
(defun scheme-send-last-sexp-split-window ()
(interactive)
(scheme-split-window)
(scheme-send-last-sexp))
(defun scheme-send-definition-split-window ()
(interactive)
(scheme-split-window)
(scheme-send-definition))
(add-hook 'scheme-mode-hook
(lambda ()
(paredit-mode 1)
(define-key scheme-mode-map (kbd "<f5>") 'scheme-send-last-sexp-split-window)
(define-key scheme-mode-map (kbd "<f6>") 'scheme-send-definition-split-window)))

问题就出在了schem-split-window函数的find语句,不知道为什么在我的电脑上不好使。

1
2

但是我的心里不爽,十分想要把这个函数搞定,于是在完全对Lisp没有学习的我进行了不断的尝试。下面是结果:

1
2
3
4
5
(defun check-scheme()
(let ((res 21))
(dolist (x (mapcar(lambda (w) (setq a (buffer-name (window-buffer w)))) (window-list))) (when (string= "*scheme*" x)(setq res 100)))
(= res 100)
))
1
2
3
4
5
6
7
8
9
10
11
12
(defun scheme-split-window ()
(cond
((= 1 (count-windows))
(delete-other-windows)
(split-window-vertically (floor (* 0.68 (window-height))))
(other-window 1)
(switch-to-buffer "*scheme*")
(other-window 1))
((not (check-scheme))
(other-window 1)
(switch-to-buffer "*scheme*")
(other-window -1))))

可以看到,主要使定义了一个check-scheme的函数,这个函数虽然是我写的不过我也是对它一知半解,真是汗颜。下面应该开始努力学习SICP了,这可是个持久战啊,加油吧。

Jerky Lu wechat
欢迎加入微信公众号